package main;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;
import juego.Juego;

/**
 * GUIJuego modela la pantalla principal del juego Carga un panel de inicio, el
 * nivel y una pantalla que avisa al usuario si completo exitosamente o no el
 * nivel
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
@SuppressWarnings("serial")
public class GUIJuego extends JFrame {

	/** Atributos de instancia */
	@SuppressWarnings("unused")
	private Juego juego;
	private GUINivel nivel;
	private JPanel juegoNuevo, perdioNivel, ganoNivel;

	/**
	 * Constructor de la GUI principal Crea los componentes de la GUI.
	 */
	public GUIJuego() {
		super("Proyecto 2 TDP 2011 - Super Mario Bros (v1)");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(700, 265);
		setBackground(new Color(92, 148, 252));
		setResizable(false);
		initGUI();
	}

	// Comandos

	/**
	 * Metodo que inicializa la GUI
	 */
	private void initGUI() {

		{ // panel de juego nuevo

			juegoNuevo = new JPanel(null);
			juegoNuevo.setPreferredSize(new java.awt.Dimension(700, 239));
			juegoNuevo.setBackground(new Color(92, 148, 252));
			juegoNuevo.setBounds(0, 0, 700, 239);
			juegoNuevo.setLocation(0, 0);
			juegoNuevo.setDoubleBuffered(true);

			JLabel fondo = new JLabel(new ImageIcon(getClass().getResource(
					"/sprite/icon/startgame.png")));
			fondo.setSize(700, 265);
			fondo.setBounds(0, 0, 700, 239);
			fondo.setLocation(0, 0);

			JPanel panelBoton = new JPanel();
			panelBoton.setSize(700, 265);
			panelBoton.setOpaque(false);
			panelBoton.setLayout(null);
			panelBoton.setLocation(0, 0);

			// aspecto del boton iniciar juego

			JButton iniciarJuego = new JButton();
			iniciarJuego.setFont(new java.awt.Font("Tahoma", 1, 13));
			iniciarJuego.setSize(150, 20);
			iniciarJuego.setText("Juego nuevo");
			iniciarJuego.setBackground(new Color(92, 148, 252));
			iniciarJuego.setForeground(new Color(255, 255, 255));
			iniciarJuego.setBorderPainted(false);
			iniciarJuego.setLocation(262, 160);
			iniciarJuego.addActionListener(new oyenteJuego(this));

			panelBoton.add(iniciarJuego);

			juegoNuevo.add(panelBoton, BorderLayout.CENTER);

			juegoNuevo.add(fondo, BorderLayout.CENTER);

		}

		{ // panel de perdio nivel
			perdioNivel = new JPanel();
			perdioNivel.setLayout(null);
			perdioNivel.setSize(700, 239);
			perdioNivel.setBounds(0, 0, 700, 239);
			perdioNivel.addMouseListener(new oyenteIniciar(perdioNivel,
					juegoNuevo, this));

			JLabel fondoPerdio = new JLabel(new ImageIcon(getClass()
					.getResource("/sprite/icon/perdionivel.png")));
			fondoPerdio.setSize(700, 265);
			fondoPerdio.setLocation(0, 0);
			fondoPerdio.setBounds(0, 0, 700, 239);

			perdioNivel.add(fondoPerdio);
		}

		{ // panel de gano nivel

			ganoNivel = new JPanel();
			ganoNivel.setLayout(null);
			ganoNivel.setSize(700, 239);
			ganoNivel.setBounds(0, 0, 700, 239);
			ganoNivel.addMouseListener(new oyenteIniciar(ganoNivel, juegoNuevo,
					this));

			JLabel fondoGano = new JLabel(new ImageIcon(getClass().getResource(
					"/sprite/icon/ganonivel.png")));
			fondoGano.setSize(700, 239);
			fondoGano.setBounds(0, 0, 700, 239);

			ganoNivel.add(fondoGano);
		}

		getContentPane().add(juegoNuevo);

	}

	/**
	 * perdioNivel establece la pantalla correspondiente a una finalizacion del
	 * nivel fallida
	 */
	public void perdioNivel() {
		getContentPane().remove(juegoNuevo);
		getContentPane().add(perdioNivel);
		nivel.setVisible(false);
		nivel.terminarNivel();
		this.setVisible(true);
	}

	/**
	 * ganoNivel establece la pantalla correspondiente a una finalizacion del
	 * nivel exitosa
	 */
	public void ganoNivel() {
		getContentPane().remove(juegoNuevo);
		getContentPane().add(ganoNivel);
		nivel.setVisible(false);
		nivel.terminarNivel();
		this.setVisible(true);

	}

	/**
	 * Remueve el primer panel y agrega el segundo al panel de contenido
	 * 
	 * @param panel1
	 *            panel a remover
	 * @param panel2
	 *            panel a agregar
	 */
	protected void cambiarPanel(JPanel panel1, JPanel panel2) {
		getContentPane().remove(panel1);
		getContentPane().add(panel2);
	}

	/**
	 * Oyente asociado al panel de juego nuevo Al hacer click en el boton de
	 * "Iniciar Juego" se crea una nueva instancia de juego y se muestra el
	 * nivel cargado.
	 */
	private class oyenteJuego implements ActionListener {

		private GUIJuego frame;
		private Juego juego;

		public oyenteJuego(GUIJuego f) {
			frame = f;
			juego = new Juego();
			juego.setGUI(frame);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
		 * )
		 */
		@Override
		public void actionPerformed(ActionEvent e) {
			juego.juegoNuevo();
			nivel = new GUINivel(juego.getNivel());

			frame.setVisible(false);
			nivel.setVisible(true);
		}

	}

	/**
	 * oyenteIniciar es el oyente asociado a las pantallas de finalizacion de
	 * juego. Al hacer click, se cambia el panel actual por el panel de juego
	 * nuevo y se da la opcion al usuario de crear una nueva partida.
	 */
	private class oyenteIniciar extends MouseAdapter {

		private JPanel fuenteEvento, panelIniciar;
		private GUIJuego frameDestino;

		public oyenteIniciar(JPanel f, JPanel p, GUIJuego d) {
			fuenteEvento = f;
			panelIniciar = p;
			frameDestino = d;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)
		 */
		public void mouseClicked(MouseEvent e) {
			frameDestino.cambiarPanel(fuenteEvento, panelIniciar);
			frameDestino.repaint();
		}
	}

	/**
	 * Metodo principal - Inicializa el juego
	 * 
	 * @param args
	 *            the arguments
	 */
	public static void main(String[] args) {
		GUIJuego fp = new GUIJuego();
		fp.setVisible(true);
	}

}
